! Copyright (C) 2009 Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors pair-methods classes kernel sequences tools.test ;
IN: pair-methods.tests

TUPLE: thang ;

TUPLE: foom < thang ;
TUPLE: barm < foom ;

TUPLE: zim < thang ;
TUPLE: zang < zim ;

: class-names ( a b prefix -- string )
    [ [ class-of name>> ] bi@ "-" glue ] dip prepend ;

PAIR-GENERIC: blibble ( a b -- c )

PAIR-M: thang thang blibble
    "vanilla " class-names ;

PAIR-M: foom thang blibble
    "chocolate " class-names ;

PAIR-M: barm thang blibble
    "strawberry " class-names ;

PAIR-M: barm zim blibble
    "coconut " class-names ;

{ "vanilla zang-zim" } [ zim new zang new blibble ] unit-test

! args automatically swap to match most specific method
{ "chocolate foom-zim" } [ foom new zim  new blibble ] unit-test
{ "chocolate foom-zim" } [ zim  new foom new blibble ] unit-test

{ "strawberry barm-barm" } [ barm new barm new blibble ] unit-test
{ "strawberry barm-foom" } [ barm new foom new blibble ] unit-test
{ "strawberry barm-foom" } [ foom new barm new blibble ] unit-test

{ "coconut barm-zang" } [ zang new barm new blibble ] unit-test
{ "coconut barm-zim" } [ barm new zim  new blibble ] unit-test

[ 1 2 blibble ] [ no-pair-method? ] must-fail-with
